/**
 * \file network/layers/eth.c
 * \date 10-16-2009
 * \author Davide Gessa
 */
#include "eth.h"
#include <sys/driver.h>
#include <malloc.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>

/**
 * Aggiunge un device alla lista
 * 
 * \param drv interfaccia per l'hardware network
 */
int eth_add_device(driver_t *drv)
{
	if(drv != NULL && drv->name != NULL && drv->read != NULL && drv->write != NULL)
	{
		eth_device_t *temp = (eth_device_t *) malloc(sizeof(eth_device_t));
		
		temp->driver = drv;
		temp->next = eth_device_list;
		eth_device_list = temp;
		
		return 0;
	}
	
	return -1;
}


/**
 * Elimina un device dalla lista
 * 
 * \param name nome dell'interfaccia
 */
int eth_del_device(char *name)
{
	
}


/**
 * Restituisce un device dato il nome
 * 
 * \param name nome dell'interfaccia
 */
eth_device_t *eth_get_device(char *name)
{
	eth_device_t *t = eth_device_list;
	
	while(t != NULL)
	{
		if(strcmp(t->dev->name, name) == 0)
			return t;
		
		t = t->next;
	}
	
	return (eth_device_t *) NULL;
}


/**
 * Riceve un frame dall'interfaccia desiderata
 * 
 * \param dev device dal quale ricevere
 * \return puntatore al frame ricevuto
 */
eth_frame_t *eth_recv_frame(eth_device_t *dev)
{
	eth_frame_t *frame = (eth_frame_t *) malloc(sizeof(eth_frame_t));
	
	dev->driver->read(frame, sizeof(*frame), 0);
	
	return frame;	
}



/**
 * Invia un frame all'interfaccia desiderata
 * 
 * \param dev device dal quale ricevere
 * \param frame puntatore al frame da inviare
 */
void eth_send_frame(eth_device_t *dev, eth_frame_t *frame)
{
	dev->driver->write(frame, sizeof(*frame), 0);
}

